/*
 * @Author: your name
 * @Date: 2022-01-11 17:55:22
 * @LastEditTime: 2022-01-11 18:32:33
 * @LastEditors: Please set LastEditors
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @FilePath: \campus-market-frontend-master\src\router.ts
 */
import { createRouter, createWebHistory } from 'vue-router'
import store from './store'
import routes from 'virtual:generated-pages'
import { Role } from './services/auth'

/**
 * 为路由 meta 提供类型信息。
 * 路由 meta 可以在各个组件的顶部 `<route lang="yaml">` 中指定。
 */
declare module 'vue-router' {
  interface RouteMeta {
    isAdmin?: boolean
    requiresAuth?: boolean
  }
}

/**
 * 创建前端路由，使用基于文件的自动路由。
 * @see https://github.com/hannoeru/vite-plugin-pages
 *
 * 基本用法：
 * src/pages/users.vue -> /users
 * src/pages/users/profile.vue -> /users/profile
 * src/pages/settings.vue -> /settings

 * 首页：
 * src/pages/index.vue -> /
 * src/pages/users/index.vue -> /users

 * 带参数的动态路由（参数在组件 props 中获取）
 * src/pages/users/[id].vue -> /users/:id (/users/one)
 * src/pages/[user]/settings.vue -> /:user/settings (/one/settings)
 */
const router = createRouter({
  history: createWebHistory(),
  routes
})

/**
 * 定义路由守卫，在每次跳转前检查路由是否需要认证（在 meta 中指定）。
 * 如 admin.vue 中的 requiresAuth: true 表示需要登录才能查看，
 * 另外 isAdmin: true 表示只有管理员才可以查看。
 */
router.beforeEach((to, from, next) => {
  const { requiresAuth, isAdmin } = to.meta

  const currentUser = store.state.currentUser

  if (requiresAuth) {
    if (!currentUser) {
      // 如果当前没登录，跳转到登录页面
      return next({ path: '/auth/frame/login', query: { returnUrl: to.path } })
    }
    if (isAdmin && !currentUser.roles.includes(Role.ADMIN)) {
      // 如果权限不足，跳转到错误页面
      return alert('权限不足')
    }
  }

  // 检查通过，继续路由跳转
  next()
})

export default router
